package V1;

import static org.junit.Assert.*;

import javax.swing.JButton;
import javax.swing.JTextField;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import Commands.CmdMarquerMesure;
import Commands.CmdMarquerTemps;
import Commands.Command;
import IHM.Afficheur;
import IHM.AfficheurImpl;
import IHM.LED;
import Metronome.Controler;
import Metronome.ControlerImpl;
import Metronome.MoteurMetronome;
import Metronome.MoteurMetronomeImpl;

public class ControlerTest {

	private LED ledMesure, ledTempo;
	private JButton start, stop;
	
	private Afficheur afficheur;
	private Controler controler;
	private MoteurMetronome moteur;
	private Command cmdMarquerTemps, cmdMarquerMesure;
	private JTextField affichageTempo, affichageMesure;
	int max, min, value;
	
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Before
	public void setUp() throws Exception {

		ledMesure = new LED();
		ledTempo = new LED();
		afficheur = new AfficheurImpl();
		moteur = new MoteurMetronomeImpl();
		controler = new ControlerImpl(moteur,afficheur);
		
		cmdMarquerTemps = new CmdMarquerTemps(controler);
		cmdMarquerMesure = new CmdMarquerMesure(controler) ;
		
		moteur.setCmdMarquerMesure(cmdMarquerMesure);
		moteur.setCmdMarquerTemps(cmdMarquerTemps);
		
		max = 120;
		min = 40;
		value = 60;
		moteur.setTempo(value);
		moteur.setMaxTempo(max);
		moteur.setMinTempo(min);
		moteur.setNbTempsParMesure(6);
		
		affichageTempo = new JTextField();
		affichageMesure = new JTextField();
		start = new JButton();
		stop = new JButton();
		
		afficheur.setAffichageMesure(affichageMesure);
		afficheur.setAffichageTempo(affichageTempo);
		afficheur.setLEDMesure(ledMesure);
		afficheur.setLEDTemps(ledTempo);
		afficheur.setStart(start);
		afficheur.setStop(stop);
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testStart() {
		controler.start();
		assertEquals(true, moteur.getEtatMarche());
	}

	@Test
	public void testStop() {
		controler.stop();
		assertEquals(false, moteur.getEtatMarche());
	}

	@Test
	public void testUpdate() {
		controler.start();
		controler.update();
		assertEquals(stop.isEnabled(), true);
		assertEquals(start.isEnabled(), false);	
	}

	@Test
	public void testUpdateFloatBoolean() {
		controler.start();
		controler.update(1, true);
		
		assertEquals("120", afficheur.getAffichageTempo().getText());
		assertEquals(true, moteur.getEtatMarche());
	}

	@Test
	public void testIncrement() {
		moteur.setNbTempsParMesure(4);
		controler.increment();
		assertEquals("5", afficheur.getAffichageMesure().getText());	
	}

	@Test
	public void testDecrement() {
		moteur.setNbTempsParMesure(4);
		controler.decrement();
		assertEquals("3", afficheur.getAffichageMesure().getText());		
	}
}
